package imai78gae.heya.util;

import imai78gae.heya.HeyaConstants;
import imai78gae.heya.exception.FileReadException;
import imai78gae.heya.exception.GoogleApiException;
import imai78gae.heya.exception.ParameterInvalidException;
import imai78gae.heya.model.Group;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import com.google.appengine.api.mail.MailService;
import com.google.appengine.api.mail.MailServiceFactory;
import com.google.appengine.api.mail.MailService.Message;

/**
 * E-Mailの送信を行う為のユーティリティです。
 * 
 * @author imai78
 *
 */
public class MailUtil {

	/**
	 * メール送信に必要な設定ファイルの{@link Properties}です。
	 */
	static Properties PROP = new Properties();
	static {
		try {
			PROP.load(new FileInputStream(new File(HeyaConstants.RROPS_FILE.MAIL)));
		} catch (FileNotFoundException e) {
			throw new FileReadException(HeyaConstants.RROPS_FILE.MAIL + " is not found.");
		} catch (IOException e) {
			throw new FileReadException(e);
		}
	}

	/**
	 * {@code targetMailAddress}で指定したメールアドレスに任意のグループへの招待メールを送信します。
	 * 
	 * @param group 招待するグループ
	 * @param userName 招待したい人の名前(メールに記載されます)
	 * @param targetMailAddress 招待したい人のメールアドレス
	 */
	public static synchronized void sendInviteMail(
			Group group, String userName, String targetMailAddress) {
		if (group == null) {
			throw new ParameterInvalidException("group is null.");
		}
		if (CheckUtil.isEmpty(userName)) {
			throw new ParameterInvalidException("userName is null.");
		}
		if (CheckUtil.isEmpty(targetMailAddress)) {
			throw new ParameterInvalidException("targetMailAddress is null.");
		}
		// 設定の読み込み
		String sender = PROP.getProperty(HeyaConstants.PROPKEY.INVITE_KEY.SENDER);
		String title = PROP.getProperty(HeyaConstants.PROPKEY.INVITE_KEY.TITLE);
		String templateFilePath = PROP.getProperty(HeyaConstants.PROPKEY.INVITE_KEY.TEMPLATE_FILEPATH);
		String template = TemplateUtil.getMailTemplate(templateFilePath);
		// Replace用コンテキストの作成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("userName", userName);
		paramMap.put("groupOwner", group.getGroupOwnerName());
		paramMap.put("groupName", group.getGroupName());
		paramMap.put("inviteKey", group.getInviteKey());
		// メール・テンプレートから本文を作成
		String contents = TemplateUtil.createMessageBody(template, paramMap);
		// 送信
		send(new Message(sender, targetMailAddress, title, contents));
	}

	/**
	 * メールを送信します。
	 * 
	 * @param msg {@link Message}
	 */
	static synchronized void send(Message msg) {
		if (msg == null) {
			throw new ParameterInvalidException("msg is null.");
		}
		MailService ms = MailServiceFactory.getMailService();
		try {
			ms.send(msg);
		} catch (IOException e) {
			throw new GoogleApiException(e);
		}
	}

}
